/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package client.gui.controls.scrabble;

import client.gui.controls.kleurschema.Kleurenschemas;
import java.awt.Component;
import java.awt.Dimension;
import java.util.ArrayList;
import java.util.Collections;
import javax.swing.*;

/**
 *
 * @author Liesbeth
 */
public class Plankje extends JPanel {

    private int MaxAantalBlokjes;
    private int maxAantalVakjes;
    private Blokje[] blokjes;

    public Plankje() {
        this(7);
    }

    public Plankje(int maxAantalBlokjes) {
        this.setPreferredSize(new Dimension(650, 30));
        setMaxAantalVakjes(15);
        this.setLayout(new java.awt.GridLayout(0, maxAantalVakjes, 3, 4));
        //this.setLayout(new java.awt.FlowLayout());
        this.setBackground(Kleurenschemas.getInstance().plankKleur);
        setMaxAantalBlokjes(maxAantalBlokjes);
        //ArrayList<Blokje> blokjes = BlokjesVerdeler.getInstance().geefblokjes(getMaxAantalBlokjes());
        this.blokjes = new Blokje[7];
        plaatsHokjes();
        //plaatsBlokjes(blokjes);
    }

    private void plaatsHokjes() {
        for (int i = 0; i < maxAantalVakjes; i++) {
            this.add(new Hokje());//plankje opvullen
        }
    }

    //Geeft een arraylist terug met daarin de blokjes die teveel waren
    //Deze blokjes konden niet toegevoegd worden aan het plankje omdat er
    //al het maximum aantal blokjes op het plankje liggen
    //Deze blokjes moeten dus teruggegeven worden naar het zakje langs serverkant
    public ArrayList<String> plaatsBlokjes(ArrayList<Blokje> arrBlokjes) {
        ArrayList<String> overbodigeBlokjes = new ArrayList<String>();

        //Alle blokjes op het spelbord plaatsen
        int i = 0;
        for (Blokje b : arrBlokjes) {
            if (getAantalBlokjes() < getMaxAantalBlokjes()) {
                plaatsBlokje(b);
                this.blokjes[i] = b;
                i++;
            } else {
                //BlokjesVerdeler.getInstance().steekBlokjeTerugInZakje(b);
                overbodigeBlokjes.add(b.getLetter());
            }
        }
        
        //Repaint forceren om de nieuwe blokjes op het spelbord te tonen
        this.revalidate();
        
        return overbodigeBlokjes;
    }

    public void shuffleLetters() {
        ArrayList<Blokje> blokjes = new ArrayList<Blokje>();

        for (Component c : this.getComponents()) {
            Hokje hokje = (Hokje) c;
            if (hokje.getVakjeOfBlokje() instanceof Blokje) {
                blokjes.add((Blokje) hokje.getVakjeOfBlokje());
            }
        }

        Collections.shuffle(blokjes);
        this.removeAll();
        plaatsHokjes();
        plaatsBlokjes(blokjes);
    }

    /*public ArrayList<Hokje> getHokjes() {
    return marrHokjes;
    }
    public void setHokjes(ArrayList<Hokje> arrHokjes) {
    this.marrHokjes = arrHokjes;
    }*/
    /*public void enableAlleBlokjesPlankje(boolean enable){
    for (Component c : this.getComponents()) {
    Hokje hokje = (Hokje) c;
    if (hokje.getVakjeOfBlokje() instanceof Blokje) {
    Blokje b = (Blokje)hokje.getVakjeOfBlokje();
    b.setGevalideerd(!enable);
    }
    }
    }*/
    public int getAantalBlokjes() {
        int iAantal = 0;
        for (Component c : this.getComponents()) {
            Hokje hokje = (Hokje) c;
            if (hokje.getVakjeOfBlokje() instanceof Blokje) {
                iAantal++;
            }
        }
        return iAantal;
    }

    public Blokje[] getBlokjes() {
        Blokje[] blokjes = new Blokje[7];
        int i = 0;
        for (Component c : this.getComponents()) {
            Hokje hokje = (Hokje) c;
            if (hokje.getVakjeOfBlokje() instanceof Blokje) {
                blokjes[i] = (Blokje) hokje.getVakjeOfBlokje();
                i++;
            }
        }
        return blokjes;
    }

    public int getMaxAantalBlokjes() {
        return MaxAantalBlokjes;
    }

    public void setMaxAantalBlokjes(int MaxAantalBlokjes) {
        this.MaxAantalBlokjes = MaxAantalBlokjes;
    }

    public void plaatsBlokje(Blokje b) {

        boolean blokjeGeplaatst = false;
        Component[] comp = this.getComponents();
        int i = 0;
        while (!blokjeGeplaatst) {
            Hokje hokje = (Hokje) comp[i];
            i++;
            if (hokje.getVakjeOfBlokje() instanceof Vakje) {
                hokje.setVakjeOfBlokje(b);
                blokjeGeplaatst = true;
            }
        }
    }
    
    public void verwijderBlokje(String oud,boolean blanco){
        //Boolean bijhouden om per keer dat je verwijderBlokje oproept, 
        //zeker maar 1 exemplaar te verwijderen
        //BV als er 3 E's zijn mag je er maar 1 per keer dat je verwijderBlokje
        //aanroept verwijderen!!
        boolean alVerwijderd = false;
        for (Component c : this.getComponents()) {
            if (((Hokje) c).getVakjeOfBlokje() instanceof Blokje) {
                 Hokje h = (Hokje) c;
                 Blokje b = (Blokje) h.getVakjeOfBlokje();
                if (((b.getLetter().equals(oud)&& !b.isBlancoBlokje())||(blanco && b.isBlancoBlokje())) && !alVerwijderd) {             
                    h.setVakjeOfBlokje(h.getVakje());
                    alVerwijderd=true;
                }
            }
        }
    }

    //vervangt een blokje met een bepaalde letter door een ander blokje
    /*public void vervangBlokje(String oud, Blokje b) {
        int i = 0;
        for (Component c : this.getComponents()) {
            if (((Hokje) c).getVakjeOfBlokje() instanceof Blokje) {
                if (((Blokje) ((Hokje) c).getVakjeOfBlokje()).getLetter().equals(oud)) {
                    this.blokjes[i] = b;
                    i++;
                }
            }
        }

    }*/

    public int getMaxAantalVakjes() {
        return maxAantalVakjes;
    }

    public void setMaxAantalVakjes(int maxAantalVakjes) {
        this.maxAantalVakjes = maxAantalVakjes;
    }
}
